Skip Navigation
Show nav
Dev Center
  • Get Started
  • ドキュメント
  • Changelog
  • Search
  • Get Started
    • Node.js
    • Ruby on Rails
    • Ruby
    • Python
    • Java
    • PHP
    • Go
    • Scala
    • Clojure
    • .NET
  • ドキュメント
  • Changelog
  • More
    Additional Resources
    • Home
    • Elements
    • Products
    • Pricing
    • Careers
    • Help
    • Status
    • Events
    • Podcasts
    • Compliance Center
    Heroku Blog

    Heroku Blog

    Find out what's new with Heroku on our blog.

    Visit Blog
  • Log inorSign up

Heroku スターターガイド (Python)

​はじめに

このチュートリアルを実施して、Heroku プラットフォームの旧世代である Cedar​ にサンプル Python アプリをデプロイします。Heroku Private Spaces​ でのみ利用可能な Fir​ 世代にアプリをデプロイするには、こちらのガイド​に従ってください。

このチュートリアルでは、以下が用意されていることを前提としています。

  • 確認済みの Heroku アカウント
  • ローカルにインストールされた Python バージョン 3.10 以上 (3.13 を推奨)。​macOS​、​Windows​、​Linux​ のインストールガイドを参照してください。
  • Eco dyno プラン​のサブスクリプション (推奨)

dyno とデータベースを使用してこのチュートリアルを完了した場合、使用量のカウントに入ります。低料金プラン​を使用してこのチュートリアルを完了することをお勧めします。資格のある学生の皆様は、新しい Heroku for GitHub Students プログラム​を通じてプラットフォームクレジットを申請できます。

​設定する

Heroku Command Line Interface​ (CLI) をインストールします。CLI は、アプリの管理やスケール、アドオンのプロビジョニング、ログの表示、ローカルでのアプリの実行に使用できます。

Heroku CLI には、一般によく使われている Git​ というバージョン管理システムが必要です。Git がまだインストールされていない場合は、先に進む前に次の手順を完了してください。

  • ​Git のインストール
  • ​Git の初期設定

ご使用のプラットフォーム用のインストーラをダウンロードし、実行してください。

apple ロゴ​macOS

​Homebrew をインストール​して実行します。

​$ ​brew install heroku/brew/heroku

windows ロゴ​Windows

​ご使用の Windows に合ったインストーラをダウンロードします。

​64 ビット用インストーラ

​32 ビット用インストーラ

Heroku CLI のその他のインストールオプションについては、こちら​を参照してください。

インストール後、コマンドシェルで heroku​ コマンドを使用できます。

​Windows では、コマンドプロンプト (cmd.exe) または Powershell を起動して、コマンドシェルを開きます。

Heroku CLI にログインするには、heroku login​ コマンドを使用します。

$ heroku login
heroku: Press any key to open up the browser to login or q to exit:
Opening browser to https://cli-auth.heroku.com/auth/cli/browser/***
heroku: Waiting for login...
Logging in... done
Logged in as me@example.com

このコマンドにより、Web ブラウザで Heroku ログインページが開きます。ブラウザですでに Heroku にログインしている場合は、ページのログイン​ボタンをクリックします。

この認証は、heroku​ と git​ コマンドが正常に動作するために必要な操作です。

Heroku CLI のインストールや使用に問題がある場合は、アドバイスとトラブルシューティングステップについて、Heroku CLI​ のメイン記事を参照してください。

外部の HTTP/HTTPS サービスへの接続にプロキシを使用するファイアウォールを利用している場合は、heroku​ コマンドを実行する前に、ローカルの開発環境で HTTP_PROXY​ または HTTPS_PROXY​ 環境変数を設定​してください。

​サンプルアプリを複製する

Heroku を初めて使う場合は、Heroku が提供するサンプルアプリケーションを使ってこのチュートリアルを行うことをお勧めします。

既存のアプリケーションをデプロイするには、代わりに「Heroku のデプロイ用にコードベースを準備する​」の記事に従ってください。

コードのローカルバージョンを取得するために、サンプルアプリケーションを複製します。以下のコマンドをローカルのコマンドシェルまたはターミナルで実行します。

$ git clone https://github.com/heroku/python-getting-started.git
$ cd python-getting-started

これで、Web フレームワーク Django​ を使用する、シンプルな Python アプリが入った正常な Git リポジトリを作成できました。これには、使用する Python バージョンを指定する .python-version​ ファイルと、Python の依存関係マネージャー pip によって使用される requirements.txt​ が含まれています。

​Procfile を定義する

Procfile​ は、アプリケーションのルートディレクトリにあるテキストファイルです。このファイルを使って、アプリの起動時に実行するコマンドを明示的に宣言します。

サンプルアプリの Procfile​ は、次のようになっています。

web: gunicorn --config gunicorn.conf.py gettingstarted.wsgi

この Procfile では、プロセスタイプ web​ と、その実行に必要なコマンドを宣言しています。web​ という名前は、このプロセスタイプが Heroku の HTTP ルーティング​スタックにアタッチし、デプロイ後に Web トラフィックを受信することを宣言しているため重要です。ここで使われているコマンドは、Gunicorn (Web サーバー) を実行し、設定ファイルを渡しています。

Procfile には追加のプロセスタイプを含めることができます。たとえば、キューからアイテムを取り出して処理するバックグラウンドワーカープロセス​を宣言できます。

Microsoft Windows

サンプルアプリには、Microsoft Windows でローカル開発を行うための追加 Procfile​ があり、ファイル Procfile.windows​ 内に配置されています。チュートリアルの後半のステップでは、代わりにこの Procfile を使用して、Windows と互換性のある別の Web サーバーを起動します。

web: python manage.py runserver %PORT%

​アプリを作成してデプロイする

dyno とデータベースを使用してこのチュートリアルを完了した場合、使用量のカウントに入ります。コストを抑制するために、完了したらすぐにアプリを削除​し、データベースも削除​してください。

 

Eco にサブスクライブしている場合、アプリではデフォルトで Eco dyno が使用されます。それ以外の場合は、デフォルトで Basic dyno が使用されます。Eco dyno プランは、アカウントのすべての Eco dyno 間で共有され、多数の小さなアプリを Heroku にデプロイする場合にお勧めします。詳細は、こちら​を参照してください。資格のある学生の皆様は、Heroku for GitHub Students プログラム​を通じてプラットフォームクレジットを申請できます。

Heroku でソースコードを受け取る準備をするには、アプリを作成します。

$ heroku create
Creating app... done, ⬢ serene-caverns-82714
https://serene-caverns-82714.herokuapp.com/ | https://git.heroku.com/serene-caverns-82714.git

アプリを作成すると、heroku​ という名前の Git リモートリポジトリも作成され、ローカルの Git リポジトリと関連付けられます。Git リモートは、他のサーバー上で稼働するリポジトリのバージョンです。アプリに関連付けられた、Heroku でホストされる特別なリモートにコードをプッシュすることにより、アプリをデプロイします。

Heroku によってランダムなアプリ名 (このケースでは serene-caverns-82714​) が生成されます。独自のアプリ名を指定​できます。

コードをデプロイします。このコマンドは、サンプルリポジトリの main​ ブランチを heroku​ リモートにプッシュし、次に Heroku にデプロイします。

$ git push heroku main
Enumerating objects: 673, done.
Counting objects: 100% (673/673), done.
Delta compression using up to 10 threads
Compressing objects: 100% (315/315), done.
Writing objects: 100% (673/673), 141.61 KiB | 141.61 MiB/s, done.
Total 673 (delta 305), reused 673 (delta 305), pack-reused 0
remote: Resolving deltas: 100% (305/305), done.
remote: Updated 30 paths from a933377
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Building on the Heroku-24 stack
remote: -----> Determining which buildpack to use for this app
remote: -----> Python app detected
remote: -----> Using Python 3.13 specified in .python-version
remote: -----> Installing Python 3.13.0
remote: -----> Installing pip 24.0
remote: -----> Installing dependencies using 'pip install -r requirements.txt'
remote:        Collecting django<5.2,>=5.1 (from -r requirements.txt (line 1))
remote:          Downloading Django-5.1.3-py3-none-any.whl.metadata (4.2 kB)
remote:        Collecting gunicorn<24,>=23 (from -r requirements.txt (line 2))
remote:          Downloading gunicorn-23.0.0-py3-none-any.whl.metadata (4.4 kB)
remote:        Collecting dj-database-url<3,>=2 (from -r requirements.txt (line 3))
remote:          Downloading dj_database_url-2.3.0-py3-none-any.whl.metadata (12 kB)
remote:        Collecting whitenoise<7,>=6 (from whitenoise[brotli]<7,>=6->-r requirements.txt (line 4))
remote:          Downloading whitenoise-6.8.2-py3-none-any.whl.metadata (3.6 kB)
remote:        Collecting asgiref<4,>=3.8.1 (from django<5.2,>=5.1->-r requirements.txt (line 1))
remote:          Downloading asgiref-3.8.1-py3-none-any.whl.metadata (9.3 kB)
remote:        Collecting sqlparse>=0.3.1 (from django<5.2,>=5.1->-r requirements.txt (line 1))
remote:          Downloading sqlparse-0.5.2-py3-none-any.whl.metadata (3.9 kB)
remote:        Collecting packaging (from gunicorn<24,>=23->-r requirements.txt (line 2))
remote:          Downloading packaging-24.2-py3-none-any.whl.metadata (3.2 kB)
remote:        Collecting typing-extensions>=3.10.0.0 (from dj-database-url<3,>=2->-r requirements.txt (line 3))
remote:          Downloading typing_extensions-4.12.2-py3-none-any.whl.metadata (3.0 kB)
remote:        Collecting brotli (from whitenoise[brotli]<7,>=6->-r requirements.txt (line 4))
remote:          Downloading Brotli-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (5.5 kB)
remote:        Downloading Django-5.1.3-py3-none-any.whl (8.3 MB)
remote:        Downloading gunicorn-23.0.0-py3-none-any.whl (85 kB)
remote:        Downloading dj_database_url-2.3.0-py3-none-any.whl (7.8 kB)
remote:        Downloading whitenoise-6.8.2-py3-none-any.whl (20 kB)
remote:        Downloading asgiref-3.8.1-py3-none-any.whl (23 kB)
remote:        Downloading sqlparse-0.5.2-py3-none-any.whl (44 kB)
remote:        Downloading typing_extensions-4.12.2-py3-none-any.whl (37 kB)
remote:        Downloading Brotli-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.9 MB)
remote:        Downloading packaging-24.2-py3-none-any.whl (65 kB)
remote:        Installing collected packages: brotli, whitenoise, typing-extensions, sqlparse, packaging, asgiref, gunicorn, django, dj-database-url
remote:        Successfully installed asgiref-3.8.1 brotli-1.1.0 dj-database-url-2.3.0 django-5.1.3 gunicorn-23.0.0 packaging-24.2 sqlparse-0.5.2 typing-extensions-4.12.2 whitenoise-6.8.2
remote: -----> $ python manage.py collectstatic --noinput
remote:        WARNING:root:No DATABASE_URL environment variable set, and so no databases setup
remote:        1 static file copied to '/tmp/build_7b27a40d/staticfiles', 1 post-processed.
remote:
remote: -----> Discovering process types
remote:        Procfile declares types -> web
remote:
remote: -----> Compressing...
remote:        Done: 28.3M
remote: -----> Launching...
remote:        Released v3
remote:        https://serene-caverns-82714.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/serene-caverns-82714.git
 * [new branch]      main -> main

これでアプリのデプロイは完了です。アプリのインスタンスが 1 つ以上実行されていることを確認します。

$ heroku ps:scale web=1

ps:scale​ の実行時にエラー Couldn't find that process type (web)​ が表示された場合は、アプリがまだデプロイ中であることを意味します。数分待ってから、再試行してください。

ログに示されている URL でアプリにアクセスします。次のショートカットを使って Web サイトを開くこともできます。

$ heroku open

​ログを表示する

Heroku では、すべてのアプリと Heroku のコンポーネントの出力ストリームから集約した時系列イベントのストリームとして、ログが扱われます。Heroku は、すべてのイベントに単一のストリームを提供します。実行中のアプリに関する情報を表示するには、ログコマンド​の 1 つである以下を使います。

$ heroku logs --tail
2024-11-26T10:45:45.914677+00:00 heroku[web.1]: Starting process with command `gunicorn --config gunicorn.conf.py gettingstarted.wsgi`
2024-11-26T10:45:46.394639+00:00 app[web.1]: Python buildpack: Detected 512 MB available memory and 8 CPU cores.
2024-11-26T10:45:46.394711+00:00 app[web.1]: Python buildpack: Defaulting WEB_CONCURRENCY to 2 based on the available memory.
2024-11-26T10:45:46.646680+00:00 app[web.1]: WARNING:root:No DATABASE_URL environment variable set, and so no databases setup
2024-11-26T10:45:46.658628+00:00 app[web.1]: [2024-11-26 10:45:46 +0000] [2] [INFO] Starting gunicorn 23.0.0
2024-11-26T10:45:46.659030+00:00 app[web.1]: [2024-11-26 10:45:46 +0000] [2] [INFO] Listening at: http://[::]:45127 (2)
2024-11-26T10:45:46.659078+00:00 app[web.1]: [2024-11-26 10:45:46 +0000] [2] [INFO] Using worker: gthread
2024-11-26T10:45:46.661895+00:00 app[web.1]: [2024-11-26 10:45:46 +0000] [8] [INFO] Booting worker with pid: 8
2024-11-26T10:45:46.676834+00:00 app[web.1]: [2024-11-26 10:45:46 +0000] [9] [INFO] Booting worker with pid: 9
2024-11-26T10:45:47.011185+00:00 heroku[web.1]: State changed from starting to up
2024-11-26T10:45:57.197212+00:00 heroku[router]: at=info method=GET path="/" host=serene-caverns-82714.herokuapp.com request_id=6993babe-09d5-442c-b6be-099d82e7f38c fwd="123.456.789.0" dyno=web.1 connect=0ms service=10ms status=200 bytes=7809 protocol=https

ログメッセージをさらに生成するには、ブラウザでアプリのホームページを更新します。

ログのストリーム出力を停止するには、Control+C​ を押します。

​アプリをスケールする

サンプルアプリをデプロイすると、1 つの Web dyno​ で自動的に実行されます。dyno とは、Procfile​ で指定されているコマンドを実行する軽量のコンテナのようなものです。

実行されている dyno の数を確認するには、ps​ コマンドを使います。

$ heroku ps
Eco dyno hours quota remaining this month: 999h 50m (99%)
Eco dyno usage for this app: 0h 0m (0%)
For more information on dyno sleeping and how to upgrade, see:
https://devcenter.heroku.com/articles/dyno-sleeping

=== web (Eco): gunicorn --config gunicorn.conf.py gettingstarted.wsgi (1)

web.1: up 2024/08/09 10:47:46 +0100 (~ 4m ago)

Heroku でアプリケーションをスケールするとは、実行中の dyno の数を変更することを意味します。Web dyno の数を 0 にスケールしてみます。

$ heroku ps:scale web=0
Scaling dynos... done, now running web at 0:Eco

ブラウザのタブで更新ボタンを押してアプリにアクセスするか、heroku open​ コマンドを使ってブラウザのタブで開きます。リクエストに応答できる Web dyno がなくなったので、エラーメッセージが表示されます。

もう一度スケールしてみましょう。

$ heroku ps:scale web=1
Scaling dynos... done, now running web at 1:Eco

Eco​ にサブスクライブしている場合、アプリではデフォルトで Eco dyno が使用されます。それ以外の場合は、デフォルトで Basic dyno が使用されます。Eco dyno プランは、アカウントのすべての Eco dyno 間で共有され、多数の小さなアプリを Heroku にデプロイする場合にお勧めします。Eco dyno は 30 分間トラフィックを何も受信しないとスリープします。このスリープ動作により、スリープ解除した最初のリクエストで数秒の遅延が発生します。Eco dyno は、月ごとに割り当てられるアカウント別の Eco dyno 時間​を消費します。割り当て時間が残っている限り、アプリは稼働し続けます。

dyno がスリープしないようにするには、「dyno タイプ​」の記事で紹介されている Basic 以上の dyno タイプにアップグレードします。少なくとも Standard dyno にアップグレードすることで、プロセスタイプあたり複数の dyno にスケールアップできます。

​アプリの依存関係をローカルでインストールする

Heroku では、主要なファイルを探すことでアプリを Python アプリとして認識します。Python アプリを認識する 1 つの方法は、ルートディレクトリに requirements.txt​ を格納することです。

デプロイしたデモ用アプリには、事前に requirements.txt​ が用意されています。

django>=5.1,<5.2
gunicorn>=23,<24
dj-database-url>=2,<3
whitenoise[brotli]>=6,<7

requirements.txt​ ファイルにはアプリの依存関係がリストされています。Heroku にアプリをデプロイすると、Python buildpack が pip install​ コマンドを使用してこれらの依存関係をインストールします。

アプリをローカルで実行するには、依存関係もローカルでインストールする必要があります。

これを実行する前に、venv​ とも呼ばれる仮想環境を作成してアクティブ化する必要があります。この環境を使用すると、システム Python のインストールに影響を与えずに、パッケージをインストールできます。

まず、ローカルの Python バージョンを確認します。

$ python3 --version

お使いの Python バージョンが 3.10 より古い場合は、仮想環境を作成する前に新しいバージョンの Python をインストールする必要があります。​macOS​、​Windows​、​Linux​ の Python インストールガイドを参照してください。

次のコマンドで、サンプルアプリのディレクトリ内に仮想環境を作成します。

$ python3 -m venv --upgrade-deps .venv

次に、仮想環境をアクティブにします。

Microsoft Windows システム​ をご使用の場合は、次のコマンドでアクティブにします。

.\.venv\Scripts\activate

macOS/Linux システム​をご使用の場合は、次のコマンドでアクティブにします。

$ source .venv/bin/activate

仮想環境の設定に関するヘルプについては、Python のドキュメント​を参照してください。

最後に、新しく作成した環境に依存関係をインストールします。

$ pip install -r requirements.txt

依存関係をインストールすると、それらの依存関係もインストールされます。pip list​ を使用して、インストールされているすべてのパッケージを表示します。

$ pip list
Package           Version
----------------- -------
asgiref           3.8.1
Brotli            1.1.0
dj-database-url   2.3.0
Django            5.1.3
gunicorn          23.0.0
packaging         24.2
pip               24.3.1
sqlparse          0.5.2
typing_extensions 4.12.2
whitenoise        6.8.2

依存関係がインストールされたら、アプリをローカルで実行できます。

​アプリをローカルで実行する

heroku local​ コマンドを使ってアプリケーションをローカルで起動します。このコマンドは、Heroku CLI の一部です。

Microsoft Windows システム​ をご使用の場合は、次のコマンドを実行します。

$ heroku local --port 5006 -f Procfile.windows

macOS/Linux システム​をご使用の場合は、次のコマンドを実行して、デフォルトの Procfile​ を使用します。

$ heroku local --port 5006

コマンドを実行するとローカル Web サーバーが起動します。

[OKAY] Loaded ENV .env File as KEY=VALUE Format
11:01:34 AM web.1 |  [2024-11-26 11:01:34 +0000] [12487] [INFO] Starting gunicorn 23.0.0
11:01:34 AM web.1 |  [2024-11-26 11:01:34 +0000] [12487] [INFO] Listening at: http://[::]:5006 (12487)
11:01:34 AM web.1 |  [2024-11-26 11:01:34 +0000] [12487] [INFO] Using worker: gthread
11:01:34 AM web.1 |  [2024-11-26 11:01:34 +0000] [12488] [INFO] Booting worker with pid: 12488

heroku local​ の実行中にエラーが表示される場合は、アプリの依存関係がローカル​にインストールされており、仮想環境が引き続きアクティブになっていることを確認してください。

Heroku と同じように、heroku local​ は Procfile​ を使用して実行するコマンドを認識します。

Web ブラウザで http://localhost:5006​ を開きます。ローカルで実行されているアプリが表示されます。

アプリのローカルでの実行を停止するには、ターミナルウィンドウに戻り、Ctrl​ + C​ を押して終了します。

​ローカルの変更をプッシュする

このステップでは、アプリケーションへのローカルでの変更を Heroku に反映させます。

requests​ パッケージを requirements.txt​ ファイルに追加します。

django>=5.1,<5.2
gunicorn>=23,<24
dj-database-url>=2,<3
whitenoise[brotli]>=6,<7
requests

pip を使用して requests​ パッケージを更新された requirements.txt​ ファイル経由でインストールします。

$ pip install -r requirements.txt

hello/views.py​ を変更して、requests​ モジュールと Django HttpResponse​ クラスをファイルの上部にインポートします。

import requests
from django.http import HttpResponse

次に、モジュールを使用するように、index​ メソッドを変更します。現在の index​ メソッドを次のコードで置き換えてみます。

def index(request):
    r = requests.get('https://httpbin.org/status/418', timeout=10)
    return HttpResponse('<pre>' + r.text + '</pre>')

次にローカルで再びテストします。

Microsoft Windows システム​ をご使用の場合は、次のコマンドを実行します。

$ heroku local --port 5006 -f Procfile.windows

macOS/Linux システム​をご使用の場合は、次のコマンドを実行して、デフォルトの Procfile​ を使用します。

$ heroku local --port 5006

http://localhost:5006​ からアプリケーションにアクセスします。変更が成功した場合は、https://httpbin.org/status/418​ を取得したときの出力が表示されます。

    -=[ teapot ]=-

       _...._
     .'  _ _ `.
    | ."` ^ `". _,
    \_;`"---"`|//
      |       ;/
      \_     _/
        `"""`

ブラウザにエラー Internal Server Error​ が表示され、ターミナルログ出力にエラー ModuleNotFoundError: No module named 'requests'​ が表示されている場合、requests​ パッケージが正常にインストールされたことを確認します。

次は、このローカルの変更を Heroku にデプロイします。

Heroku へのデプロイは、ほとんどの場合、このパターンで行います。まず、変更したファイルをローカルの Git リポジトリに追加します。

$ git add .

次に、変更内容をリポジトリにコミットします。

$ git commit -m "Updated index view"

次に、以前と同じようにデプロイします。

$ git push heroku main

最後に、すべて正常に動作しているかどうかを確認します。

$ heroku open

​ログ記録アドオンをプロビジョニングする

アドオンは、アプリケーションですぐに使える追加サービスを提供するサードパーティのクラウドサービスです。永続性、ログ記録、モニタリングなど、さまざまなアドオンがあります。

Heroku では、デフォルトで 1500 行のアプリケーションログが記録されますが、完全なログストリームはサービスとして提供されています。複数のアドオンプロバイダーが、ログの永続化、検索、メールや SMS 通知などの機能を提供するログサービスを用意しています。

このステップでは、このようなログ関連アドオンの 1 つである、Papertrail​ をプロビジョニングします。

Papertrail ログ記録アドオンをプロビジョニングします。

$ heroku addons:create papertrail
Creating papertrail on ⬢ serene-caverns-82714... free
Welcome to Papertrail. Questions and ideas are welcome (technicalsupport@solarwinds.com). Happy logging!
Created papertrail-convex-88929 as PAPERTRAIL_API_TOKEN
Use heroku addons:docs papertrail to view documentation

アドオンがデプロイされ、アプリケーション用に設定されました。アプリのアドオンは、次のコマンドで一覧表示できます。

$ heroku addons

このアドオンが動作していることを確認するため、アプリケーションの Heroku URL に数回アクセスします。アクセスするたびにログメッセージが生成され、Papertrail のアドオンに送られます。Papertrail のコンソールにアクセスし、ログメッセージを確認します。

$ heroku addons:open papertrail

ブラウザで Papertrail の Web コンソールが開き、最新のログイベントが表示されます。このインターフェースでは、検索したり通知を設定したりできます。

コンソールのスクリーンショット

​コンソールを起動する

One-off dyno​ で、heroku run​ コマンドを使ってコマンド (通常はアプリの一部を構成するスクリプトやアプリケーション) を実行できます。アプリの環境で試行するためにローカルターミナルにアタッチされた REPL プロセスを起動することもできます。

$ heroku run python manage.py shell
Running python manage.py shell on ⬢ serene-caverns-82714... up, run.9594 (Eco)
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>

Error connecting to process​ というエラーが表示された場合は、ファイアウォールを設定します​。

アプリとアプリのすべての依存関係の環境で Python シェルが実行されます。ここから、一部のアプリケーションファイルをインポートできます。たとえば、次のコードを実行できます。

>>> import requests
>>> r = requests.get('https://httpbin.org/status/418', timeout=10)
>>> print(r.text)

    -=[ teapot ]=-

       _...._
     .'  _ _ `.
    | ."` ^ `". _,
    \_;`"---"`|//
      |       ;/
      \_     _/
        `"""`

コマンド exit()​ を実行して Python シェルを終了し、dyno を終了します。

別の例を試してみましょう。別の One-off dyno を作成し、bash​ コマンドを実行して、その dyno でシェルを開きます。シェルが開いたら、そこでコマンドを実行できます。それぞれの dyno には専用の一時的ファイル領域があり、アプリとその依存関係が入力されています。コマンドが完了したら (このケースでは bash​)、dyno が終了します。:

$ heroku run bash
Running bash on ⬢ serene-caverns-82714... up, run.3789 (Eco)
~ $ ls -A
app.json  .env        .github     hello    manage.py  Procfile.windows  .python-version  requirements.txt
.cache    gettingstarted  .gitignore  .heroku  Procfile   .profile.d        README.md        staticfiles
~ $ exit
exit

コマンド exit​ を実行して Bash シェルを終了し、dyno を終了します。

​環境設定を定義する

Heroku では、暗号鍵や外部リソースのアドレスなどのデータを環境設定​に保存して、設定を外部に置くことができます。

実行時に、環境設定が環境変数としてアプリケーションに公開されます。

hello/views.py​ を編集します。ファイルの先頭に、os​ モジュールをインポートする行を追加します。

import os
from django.http import HttpResponse

index​ メソッドを編集し、環境変数 TIMES​ の値に応じてあるアクションを繰り返し実行するようにします。

def index(request):
    times = int(os.environ.get('TIMES', 3))
    return HttpResponse('Hello! ' * times)

ローカルディレクトリにある .env​ ファイルの内容に応じて、heroku local​ コマンドによって環境が自動的に設定されます。サンプルプロジェクトのトップレベルディレクトリにはすでに .env​ ファイルがあり、以下の行が含まれています。

TIMES=2

heroku local --port 5006​ でアプリを実行して http://localhost:5006​ にアクセスすると、「Hello!」と 2 回表示されます。

Heroku で環境設定を設定するには、次のコマンドを実行します。

$ heroku config:set TIMES=2

heroku config​ を使用して、アプリの環境設定を表示します。

$ heroku config
=== serene-caverns-82714 Config Vars
PAPERTRAIL_API_TOKEN: <SECRET_TOKEN>
TIMES:                2

このアクションの変更を確認するには、変更したアプリケーションを Heroku にデプロイします。

​データベースをプロビジョニングして使用する

add-on marketplace​ には、Redis や MongoDB、Postgres、MySQL など、多数のデータストアが揃っています。

essential-0​ Postgres のサイズのコストは月額 5 ドルで、分単位で課金されます​。このチュートリアルの最後で、データベースを削除​して、コストを最小限に抑えるように求められます。

essential-0​ Heroku Postgres アドオンをプロビジョニングするには、addons:create​ コマンドを使用します。

$ heroku addons:create heroku-postgresql:essential-0
Creating heroku-postgresql:essential-0 on ⬢ serene-caverns-82714... ~$0.007/hour (max $5/month)
Database should be available soon
postgresql-deep-45610 is being created in the background. The app will restart when complete...
Use heroku addons:info postgresql-deep-45610 to check creation progress
Use heroku addons:docs heroku-postgresql to view documentation

CLI で addons​ コマンドを使うと、アプリにプロビジョニングされたデータベースの詳細について確認できます。

$ heroku addons
 Add-on                                    Plan        Price        Max price State
 ───────────────────────────────────────── ─────────── ──────────── ───────── ────────
 heroku-postgresql (postgresql-deep-45610) essential-0 ~$0.007/hour $5/month  creating
  └─ as DATABASE
...

アプリの環境設定を一覧表示すると、アプリがデータベースに接続するときに使用する URL (DATABASE_URL​) が表示されます。

$ heroku config
=== serene-caverns-82714 Config Vars

DATABASE_URL: postgres://ub3r5i9vnl3fnm:<PASSWORD>@c5p86clmevrg5s.cluster-czrs8kj4isg7.us-east-1.rds.amazonaws.com:5432/d10gkj42hdl30i
...

Heroku には、さらに詳細を表示する pg​ コマンドもあります。

$ heroku pg
=== DATABASE_URL

Plan:                  essential-0
Status:                Available
Connections:           0/20
PG Version:            16.2
Created:               2024-08-09 09:55
Data Size:             7.57 MB / 1 GB (0.74%) (In compliance)
Tables:                0/4000 (In compliance)
Fork/Follow:           Unsupported
Rollback:              Unsupported
Continuous Protection: Off
Add-on:                postgresql-deep-45610

この情報は、essential-0​ データベースが Postgres v16.2 を実行しており、テーブルがないことを示しています。

デプロイしたサンプルアプリにはすでにデータベース機能が備わっていますが、それを有効にするには、2 つの小さな変更を行う必要があります。

まず、requirements.txt​ ファイルの末尾にある 2 行の psycopg​ のコメントを解除します。

psycopg[c]; sys_platform == "linux"
psycopg[binary]; sys_platform != "linux"

これらの行により、ビルド時に、Postgres データベースアダプターパッケージがインストールされます。

次に、Procfile​ ファイルの末尾にある release​ プロセス行のコメントを解除します。

release: ./manage.py migrate --no-input

この release​ プロセスエントリによって、Heroku リリースフェーズ​機能が有効になり、それを使用して、アプリのデプロイ時に常に Django データベース移行が実行されます。

前と同じデプロイプロセスを使用して、変更したアプリケーションを Heroku にデプロイします。ビルド後に Django のデータベース移行が実行されることを確認できます。

remote: Running release command...
remote:
remote: Operations to perform:
remote:   Apply all migrations: auth, contenttypes, hello, sessions
remote: Running migrations:
remote:   Applying contenttypes.0001_initial... OK
remote:   Applying contenttypes.0002_remove_content_type_name... OK
remote:   Applying auth.0001_initial... OK
remote:   Applying auth.0002_alter_permission_name_max_length... OK
remote:   Applying auth.0003_alter_user_email_max_length... OK
remote:   Applying auth.0004_alter_user_username_opts... OK
remote:   Applying auth.0005_alter_user_last_login_null... OK
remote:   Applying auth.0006_require_contenttypes_0002... OK
remote:   Applying auth.0007_alter_validators_add_error_messages... OK
remote:   Applying auth.0008_alter_user_username_max_length... OK
remote:   Applying auth.0009_alter_user_last_name_max_length... OK
remote:   Applying auth.0010_alter_group_name_max_length... OK
remote:   Applying auth.0011_update_proxy_permissions... OK
remote:   Applying auth.0012_alter_user_first_name_max_length... OK
remote:   Applying hello.0001_initial... OK
remote:   Applying sessions.0001_initial... OK
remote: Waiting for release.... done.

ビルドが settings.DATABASES is improperly configured​ エラーで失敗した場合は、デプロイの前にデータベースアドオンをプロビジョニングしていることを確認します。

アプリの URL にアクセスし、/db​ を追加して、データベースデモンストレーションページにアクセスします。たとえば、アプリが https://serene-caverns-82714.herokuapp.com/​ にデプロイされている場合は、https://serene-caverns-82714.herokuapp.com/db​ にアクセスします。

再度 /db​ ルートにアクセスすると、アクセスするたびにシンプルなページの更新が表示されます。

Page View Report

Aug. 9, 2024, 10:07 a.m.
Aug. 9, 2024, 10:08 a.m.

データベースにアクセスするためのコードは簡単です。これは Greetings​ というシンプルな Django モデルを使用しており、hello/models.py​ にあります。

アプリの /db​ ルートにアクセスするたびに hello/views.py​ ファイル内の次のメソッドが呼び出され、挨拶が作成されます。次に、既存のすべての挨拶がレンダリングされます。

def db(request):

    greeting = Greeting()
    greeting.save()

    greetings = Greeting.objects.all()

    return render(request, 'db.html', {'greetings': greetings})

Postgres がローカルでインストールされている​場合、heroku pg:psql​ コマンドを使ってリモートデータベースに接続し、すべての行を表示します。

$ heroku pg:psql
--> Connecting to postgresql-deep-45610
...
Type "help" for help.

serene-caverns-82714::DATABASE=>

詳細は、「Heroku PostgreSQL​」を参照してください。

同様のテクニックを使用して、MongoDB または Redis アドオン​をインストールできます。

次のステップ

ここまで、アプリのデプロイ、アプリの設定変更、ログの表示、スケール、アドオンのアタッチを行う方法を説明しました。

次にお勧めするリソースを紹介します。

  • 「Heroku の仕組み​」では、アプリケーションの作成、設定、デプロイ、および実行時に必要な技術的な概念の概要を紹介しています。
  • 既存の Python または Django アプリを Heroku にデプロイするには、「Heroku での Python および Django アプリのデプロイ​」を参照してください。
  • Python アプリケーションの開発とデプロイの詳細については、Python カテゴリ​を参照してください。

コストを抑制するために、チュートリアルを完了したらすぐにサンプルアプリを削除​し、データベースも削除​してください。

アプリとアドオンを削除する

アカウントからアプリとデータベースを削除します。使用したリソースに対してのみ課金されます。

この操作により、アドオンとデータベースに保存されたすべてのデータが削除されます。

$ heroku addons:destroy heroku-postgresql

この操作により、アプリケーションが完全に削除されます。

$ heroku apps:destroy

以下のコマンドによって、アドオンとアプリが消去されたことを確認できます。

$ heroku addons --all
$ heroku apps --all

Information & Support

  • Getting Started
  • Documentation
  • Changelog
  • Compliance Center
  • Training & Education
  • Blog
  • Support Channels
  • Status

Language Reference

  • Node.js
  • Ruby
  • Java
  • PHP
  • Python
  • Go
  • Scala
  • Clojure
  • .NET

Other Resources

  • Careers
  • Elements
  • Products
  • Pricing
  • RSS
    • Dev Center Articles
    • Dev Center Changelog
    • Heroku Blog
    • Heroku News Blog
    • Heroku Engineering Blog
  • Twitter
    • Dev Center Articles
    • Dev Center Changelog
    • Heroku
    • Heroku Status
  • Github
  • LinkedIn
  • © 2025 Salesforce, Inc. All rights reserved. Various trademarks held by their respective owners. Salesforce Tower, 415 Mission Street, 3rd Floor, San Francisco, CA 94105, United States
  • heroku.com
  • Legal
  • Terms of Service
  • Privacy Information
  • Responsible Disclosure
  • Trust
  • Contact
  • Cookie Preferences
  • Your Privacy Choices